// HDU2586 How far away ？  ECJTU 2009 Spring Contest
// 陈锋
#include <bits/stdc++.h>
using namespace std;
const int NN = 40000 + 4;
int N, L, Tin[NN], Tout[NN], UP[NN][18], timer;
struct Edge { int v, k; };
vector<Edge> G[NN];
int Dist[NN], D[NN];   // 到root的距离，深度
void dfs(int u, int fa) {  // LCA预处理
  Tin[u] = ++timer, UP[u][0] = fa;
  if (u) D[u] = D[fa] + 1;
  for (int i = 1; i < L; i++) UP[u][i] = UP[UP[u][i - 1]][i - 1];
  for (size_t i = 0; i < G[u].size(); i++) {
    const Edge& e = G[u][i];
    if (e.v != fa) Dist[e.v] = Dist[u] + e.k, dfs(e.v, u);
  }
  Tout[u] = ++timer;
}
bool isAncestor(int u, int v) { return Tin[u] <= Tin[v] && Tout[u] >= Tout[v]; }
int LCA(int u, int v) {
  if (D[u] > D[v]) return LCA(v, u);  // 保证u的深度<v的深度
  if (isAncestor(u, v)) return u;     // u是v的祖先
  for (int i = L; i >= 0; --i)
    if (!isAncestor(UP[u][i], v)) u = UP[u][i];
  return UP[u][0];
}
int main() {
  ios::sync_with_stdio(false), cin.tie(0);
  int T, M;
  cin >> T;
  while(T--){
    cin >> N >> M, L = ceil(log2(N));
    for (int i = 0; i < N; i++) G[i].clear();
    for (int i = 0, u, v, k; i < N - 1; i++){
      cin >> u >> v >> k, u--, v--;
      G[u].push_back((Edge){v, k}), G[v].push_back((Edge){u, k});
    }
    memset(UP, 0, sizeof(UP)), Dist[0] = 0, D[0] = 0;
    dfs(0, 0);
    for (int i = 0, u, v; i < M; i++) {
      cin >> u >> v, u--, v--;
      cout << Dist[u] + Dist[v] - 2 * Dist[LCA(u, v)] << endl;
    }
  }
  return 0;
}
/*
算法分析请参考: 《入门经典训练指南-升级版》3.7 例题33
注意本题充分利用DFS时间戳简化了祖先关系的判断操作
并且将查找LCA的过程简化到只有一个循环
*/
// Accepted 46ms 10220kB 1526 G++2020-01-30 11:30:51